package control;

import java.util.ArrayList;
import java.util.List;
import model.Empire;
import model.Player;
import model.Province;


public class ControllerPlayer {

    private List<Player> listPlayers = new ArrayList<Player>();

    public ControllerPlayer () {
    }

    /**
     * Initialization of the player's parameters
     */
    public void ini()
    {
        for(Player p : listPlayers)
        {
            int pts = ControllerPrincipal.getINSTANCE().getControllerGameBoard().getGameBoard().getInitialPts();
            p.setNbTroops(pts);
            p.setAvailableTroops(pts);
            p.setPoints(pts);
        }
    }

    /**
     * Select a player randomly
     * @return : A random player
     */
    public Player getRandomPlayer ()
    {
        double rdm = Math.random();
        int max = listPlayers.size() - 1;
        int choice = (int)(Math.round(rdm*max));

        //System.out.println("Player | Taille du tableau : "+max);
        //System.out.println("Player | Carte demandée : "+choice);

        return listPlayers.get(choice);
    }

    /**
     * Resort the list of players as well as the game starting player would be first of the list
     * @param first
     */
    public void setPlayersTurn(Player first)
    {
        if(!listPlayers.get(0).equals(first))
        {
            listPlayers.add(listPlayers.get(0));
            listPlayers.remove(first);
            listPlayers.set(0, first);
        }
    }

    public void checkPlayerStatus(Player p)
    {
        if(p.getEmpires().size() == 0)                  /* Pas d'empire */
        {
            /*Possibilités du joueur :
             *  Choisir nouvelle civilisation
             */
        }
        if(p.getEmpires().size() == 1)
        {
            if(p.getEmpire(true) != null)               /* Un empire qui est en déclin */
            {
                /*Possibilités du joueur :
                 *  Choisir nouvelle civilisation
                 */
            }
            else                                        /* Un empire qui est actif */
            {
                if(p.getEmpire(false).getListProvinces().size() == 0)   /* Sans province */
                {
                    if(p.getNbTroops()>0)                                   /* Avec des troupes */
                    {
                        /*Possibilités du joueur :
                         *  Conquérir une province d'entrée
                         */
                    }
                    else                                                    /* Sans troupes */
                    {
                        /* L'empire doit être mis en déclin */
                    }
                }
                else                                                    /* Avec au moins une province */
                {
                    if(p.getNbTroops()>0)                                   /* Avec des troupes */
                    {
                        /*Possibilités du joueur :
                         *  Conquérir une province adjacente
                         *  Déclarer l'empire en déclin
                         */
                    }
                    else                                                    /* Sans troupes */
                    {
                        /* L'empire doit être mis en déclin */
                    }
                }
            }
        }
        if(p.getEmpires().size() == 2)                  /* Deux empires (forcément un actif, un en déclin */
        {
            if(p.getEmpire(true).getListProvinces().size() == 0)    /* Empire en déclin sans province */
            {
                /* Empire en déclin à supprimer */
            }

            if(p.getEmpire(false).getListProvinces().size() == 0)   /* Empire actif sans province */
            {
                if(p.getNbTroops()>0)                                   /* Avec des troupes */
                    {
                        /*Possibilités du joueur :
                         *  Conquérir une province d'entrée
                         */
                    }
                    else                                                    /* Sans troupes */
                    {
                        /* L'empire doit être mis en déclin */
                    }
            }
            else                                                    /* Avec au moins une province */
            {
                if(p.getNbTroops()>0)                                   /* Avec des troupes */
                {
                    /*Possibilités du joueur :
                     *  Conquérir une province adjacente
                     *  Déclarer l'empire en déclin
                     */
                }
                else                                                    /* Sans troupes */
                {
                    /* L'empire doit être mis en déclin */
                }
            }
        }
    }

    /**
     * Find the owner of a defined province
     * @param p : The defined province
     * @return : Player who owns the province
     */
    public Player getPlayerFromProvince(Province p)
    {
        for(Player pl : this.getListPlayers())
        {
            if(pl.getEmpire(false) != null)
            {
                for(Province pr : pl.getEmpire(false).getListProvinces())
                {
                    if(pr.equals(p))
                    {
                        return pl;
                    }
                }
            }
        }
        return null;
    }

    /**
     * Find the owner of an defined empire
     * @param e : The defined empire
     * @return : Player who owns the empire
     */
    public static Player getPlayerFromEmpire(Empire e)
    {
        for(Player p : ControllerPrincipal.getINSTANCE().getControllerPlayer().getListPlayers())
        {
            for(Empire em : p.getEmpires())
            {
                if(em.equals(e))
                {
                    return p;
                }
            }
        }
        return null;
    }

    /**
     * Find the player with the best score
     * @return : Player with the best score
     */
    public Player getBestPlayer()
    {
        int max = 0;
        Player best = null;
        for(Player p : listPlayers)
        {
            if(p.getPoints()> max)
            {
                max = p.getPoints();
                best = p;
            }
        }
        return best;
    }

    public Player getPlayerByName(String nickname)
    {
        for(Player p : listPlayers)
        {
            if(p.getNickname().equals(nickname))
            {
                return p;
            }
        }
        return null;
    }
    /***************************** GETTERS & SETTERS **************************/

    public List<Player> getListPlayers () {
        return listPlayers;
    }
}

